package com.neusoft.hifly.core.log.thread;

import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.neusoft.hifly.commons.lang.StringConstants;
import com.neusoft.hifly.commons.lang.StringUtil;
import com.neusoft.hifly.core.config.SystemConfig;
import com.neusoft.hifly.core.log.Log;
import com.neusoft.hifly.core.token.TokenContextHolder;
import com.neusoft.hifly.core.token.domain.TokenVO;

/**
 * Title: 核心类库
 * <p>
 * Description: 记录系统日志
 * <p>
 * Copyright: 2019
 * <p>
 * Company: 东软汉枫
 *
 * @author lh_neu
 * @version 1.0.0
 */
@Component
@Scope("prototype") //spring 多例
public class LoggingThread implements Runnable {

	/**
	 * 操作类型: 登录失败
	 */
	public static final String TYPE_ERROE_LOGIN = "登录失败";
	/**
	 * 操作类型: 登录
	 */
	public static final String TYPE_LOGIN = "登录";
	/**
	 * 操作类型: 注销
	 */
	public static final String TYPE_LOGOUT = "注销";
	/**
	 * 操作类型: 新增
	 */
	public static final String TYPE_ADD = "新增";
	/**
	 * 操作类型: 更新
	 */
	public static final String TYPE_EDIT = "更新";
	/**
	 * 操作类型: 删除
	 */
	public static final String TYPE_DELETE = "删除";
	/**
	 * 操作类型: 数据导入
	 */
	public static final String TYPE_IMPORT = "数据导入";
	/**
	 * 操作类型: 数据导出
	 */
	public static final String TYPE_EXPORT = "数据导出";

	// 配置
	private SystemConfig systemConfig;
	// 日志内容
	private String message;
	// 操作
	private String operate;
	// 租户编码
	private String organCode;
	// IP
	private String ip;
	// URL
	private String url;

	/**
	 * default
	 */
	public LoggingThread() {
	}

	/**
	 * 构造方法
	 *
	 * @param message
	 *            日志信息
	 * @param operate
	 *            日志类别
	 */
	public LoggingThread(final String message, final String operate) {
		this.message = message;
		this.operate = operate;
	}

	/**
	 * 构造方法
	 *
	 * @param systemConfig
	 *            配置
	 * @param message
	 *            日志信息
	 * @param operate
	 *            日志类别
	 * @param ip
	 *            IP
	 * @param url
	 *            URL
	 */
	public LoggingThread(final SystemConfig systemConfig, final String message, final String operate, final String ip,
			final String url) {
		this.systemConfig = systemConfig;
		this.message = message;
		this.operate = operate;
		this.ip = ip;
		this.url = url;
	}

	/**
	 * 执行线程
	 */
	@Override
	public void run() {
		if (StringUtils.isEmpty(message)) {
			return;
		}
		this.saveToFile();
	}

	/**
	 * 保存数据到文件
	 */
	private void saveToFile() {
		String loginName = "无";

		final TokenVO tokenVO = TokenContextHolder.get();

		if (tokenVO != null) {
			// 发布系统中的用户
			loginName = tokenVO.getLoginName();
		}

		String sysName = " ( " + this.organCode + " ) ";

		if (systemConfig != null) {
			sysName = systemConfig.getSysName() + sysName;
		}

		// 写入日志文件（逗号分隔），便于工具抓取（HDFS抓取）
		final StringBuffer sb = new StringBuffer("");
		sb.append(loginName);
		sb.append(StringConstants.STRING_SPLIT_FLAG_3);
		sb.append(this.ip);
		sb.append(StringConstants.STRING_SPLIT_FLAG_3);
		sb.append(this.url);
		sb.append(StringConstants.STRING_SPLIT_FLAG_3);
		sb.append(sysName);
		sb.append(StringConstants.STRING_SPLIT_FLAG_3);
		sb.append(StringUtil.getTraceInfo());
		sb.append(StringConstants.STRING_SPLIT_FLAG_3);
		sb.append(this.operate);
		sb.append(StringConstants.STRING_SPLIT_FLAG_3);
		sb.append(this.message);
		Log.info(sb.toString());

	}

}
